trait ECore {
	type TExpr <: Expr$ECore
	type TNum <: TExpr with Num$ECore
	
	def Num(n :Int) :TNum
	
	trait Expr$ECore requires TExpr {type t}
	  trait Num$ECore requires TNum extends Expr$ECore{type t=Int; val n :Int}
}

trait EEval requires (ECore with EEval) {
	type TExpr <: Expr$ECore with Expr$EEval 
	type TNum <: TExpr with Num$ECore 
	                   with Num$EEval

	trait Expr$EEval requires TExpr {
		def eval :t 
	}
	
	trait Num$EEval requires TNum 
	                 extends Expr$EEval {
		def eval = n
	}
}

class Deployment extends ECore 
                    with EEval {
	type TExpr = Expr$ECore with Expr$EEval
	type TNum = Num$ECore with Num$EEval
	 
	def Num(nn :Int) = new Num$ECore with 
	                       Num$EEval {val n=nn}
}
